package handle

import (
	"context"
	"fmt"
	"os"

	"protocx/entity"

	"github.com/cloudwego/hertz/pkg/app"
	"github.com/cloudwego/hertz/pkg/app/server"
)

func NewReq() Req {
	return Req{}
}

type Req struct {
}

func (r Req) InitRoute(server *server.Hertz) {
	server.GET("/ping", r.ping())

	p := server.Group("/req")
	p.POST("/form-data", r.form())
	p.POST("/form-ulencoded", r.formUrlencoded())

	p.GET("/path/:name/:ext", r.path())
	p.GET("/query/bind", r.BindQuery())
	p.GET("/query", r.query())
	p.POST("/binary", r.binary())
	p.POST("/json", r.json())
	p.POST("/raw", r.raw())
}

func (r Req) form() app.HandlerFunc {
	return func(c context.Context, ctx *app.RequestContext) {
		form, err := ctx.MultipartForm()
		if err != nil {
			ctx.JSON(402, err)
			return
		}

		for s, strings := range form.Value {
			fmt.Println("MultipartForm.Value", s, strings)
		}

		fmt.Println("PostArgs", ctx.PostArgs())
	}
}
func (r Req) formUrlencoded() app.HandlerFunc {
	return func(c context.Context, ctx *app.RequestContext) {
		fmt.Println(ctx.PostArgs())
		//fmt.Println(ctx.PostForm("name"))
	}
}
func (r Req) query() app.HandlerFunc {
	return func(c context.Context, ctx *app.RequestContext) {
		fmt.Println(ctx.QueryArgs())
	}
}
func (r Req) path() app.HandlerFunc {
	return func(c context.Context, ctx *app.RequestContext) {
		fmt.Println(ctx.Params)
	}
}

func (r Req) BindQuery() app.HandlerFunc {
	return func(c context.Context, ctx *app.RequestContext) {
		var person entity.Person
		if err := ctx.BindQuery(&person); err != nil {
			ctx.JSON(400, err)
			return
		}

		ctx.JSON(200, person)
	}
}
func (r Req) binary() app.HandlerFunc {
	return func(c context.Context, ctx *app.RequestContext) {
		body, err := ctx.Body()
		if err != nil {
			panic(err)
		}

		err = os.WriteFile("./upload.png", body, 0644)
		if err != nil {
			panic(err)
		}
	}
}
func (r Req) json() app.HandlerFunc {
	return func(c context.Context, ctx *app.RequestContext) {
		body, err := ctx.Body()
		if err != nil {
			panic(err)
		}

		fmt.Println(string(body))

		var user entity.User

		err = ctx.BindJSON(&user)
		if err != nil {
			panic(err)
		}

		ctx.JSON(200, user)
	}
}
func (r Req) raw() app.HandlerFunc {
	return func(c context.Context, ctx *app.RequestContext) {
		body, err := ctx.Body()
		if err != nil {
			panic(err)
		}

		fmt.Println(string(body))
		fmt.Println(string(ctx.GetRawData()))
	}
}
func (r Req) ping() app.HandlerFunc {
	return func(c context.Context, ctx *app.RequestContext) {
		ctx.WriteString("pong\n")
	}
}
